package AbstractTemplate;

/**
 * @author Jimmy Zhan WORKSTATION
 * @since 2023/7/30 19:31
 * 说明： 模板方法模式
 *          它在父类中定义了一个算法的框架，允许子类在不修改结构的情况下重写算法的特定步骤
 * 场景：
 *          要做一件事，这件事的步骤是固定的，但是每个步骤的具体实现方式又有差别
 * 这种情况我们会把所有要做的事情都抽象到一个抽象类中，并在该类中定义一个模板方法，这就是所谓的模板方法模式
 *
 * 一句话总结：
 *          行为由父类控制，子类负责实现
 */

public class Template {
    public static void main(String[] args) {
        Cooking cooking = new CookingFood();
        cooking.cook();
    }
}

abstract class Cooking {
    // 固定的步骤一和步骤二，只不过是用的抽象方法，让子类自己去实现
    protected abstract void step1();
    protected abstract void step2();
    // 模板。在这里可以规定上面的步骤都是按照何种方式执行的。
    // 如下：先吼一声要开始做饭了，然后步骤1，步骤2，最后再吼一声我tm做完啦
    public void cook() {
        System.out.println("start cooking.");
        step1();
        step2();
        System.out.println("cooking finished.");
    }

}

// 子类继承抽象模板方法类，实现步骤
class CookingFood extends Cooking {
    @Override
    protected void step1() {
        System.out.println("放西红柿");
    }

    @Override
    protected void step2() {
        System.out.println("放鸡蛋和盐");
    }
}